const char* name;
double a;
double invf;
+
+ constexpr double b() const {
+ return a - a/invf;
+ }
};
+// EPSG:7001
+constexpr GPS_Ellipse Airy1830_Ellipse = { "Airy 1830", 6377563.396, 299.3249646 };
+
+// EPSG:7002
+constexpr GPS_Ellipse Airy1830Modified_Ellipse = { "Airy 1830 Modified", 6377340.189, 299.3249646 };
+
+// EPSG:7004
+constexpr GPS_Ellipse Bessel1841_Ellipse = { "Bessel 1841", 6377397.155, 299.1528128 };
+
+// EPSG:7019
+constexpr GPS_Ellipse GRS80_Ellipse = { "GRS80", 6378137.000, 298.257222101 };
+
+// EPSG:4326
+constexpr GPS_Ellipse WGS84_Ellipse = { "WGS84", 6378137.000, 298.257223563 };
+
const GPS_Ellipse GPS_Ellipses[]= {
- { "Airy 1830", 6377563.396, 299.3249646 },
- { "Airy 1830 Modified", 6377340.189, 299.3249646 },
+ Airy1830_Ellipse,
+ Airy1830Modified_Ellipse,
{ "Australian National", 6378160.000, 298.25 },
{ "Bessel 1841 (Namibia)", 6377483.865, 299.1528128 },
- { "Bessel 1841", 6377397.155, 299.1528128 },
+ Bessel1841_Ellipse,
{ "Clarke 1866", 6378206.400, 294.9786982 },
{ "Clarke 1880", 6378249.145, 293.465 },
{ "Everest (India 1830)", 6377276.345, 300.8017 },
{ "Krassovsky 1940", 6378245.000, 298.3 },
{ "GRS67", 6378160.000, 6356774.516 },
{ "GRS75", 6378140.000, 6356755.288 },
- { "GRS80", 6378137.000, 298.257222101 },
+ GRS80_Ellipse,
{ "S. American 1969", 6378160.000, 298.25 },
{ "WGS60", 6378165.000, 298.3 },
{ "WGS66", 6378145.000, 298.25 },
{ "WGS72", 6378135.000, 298.26 },
- { "WGS84", 6378137.000, 298.257223563 },
+ WGS84_Ellipse,
{ "Clarke 1880 (Benoit)", 6378300.789, 293.466 },
};
void GPS_Math_Airy1830LatLonH_To_XYZ(double phi, double lambda, double H,
double* x, double* y, double* z)
{
- double a = 6377563.396;
- double b = 6356256.910;
+ constexpr double a = Airy1830_Ellipse.a;
+ constexpr double b = Airy1830_Ellipse.b();
GPS_Math_LatLonH_To_XYZ(phi,lambda,H,x,y,z,a,b);
void GPS_Math_WGS84LatLonH_To_XYZ(double phi, double lambda, double H,
double* x, double* y, double* z)
{
- double a = 6378137.000;
- double b = 6356752.314245;
+ constexpr double a = WGS84_Ellipse.a;
+ constexpr double b = WGS84_Ellipse.b();
GPS_Math_LatLonH_To_XYZ(phi,lambda,H,x,y,z,a,b);
void GPS_Math_XYZ_To_Airy1830LatLonH(double* phi, double* lambda, double* H,
double x, double y, double z)
{
- double a = 6377563.396;
- double b = 6356256.910;
+ constexpr double a = Airy1830_Ellipse.a;
+ constexpr double b = Airy1830_Ellipse.b();
GPS_Math_XYZ_To_LatLonH(phi,lambda,H,x,y,z,a,b);
void GPS_Math_XYZ_To_WGS84LatLonH(double* phi, double* lambda, double* H,
double x, double y, double z)
{
- double a = 6378137.000;
- double b = 6356752.314245;
+ constexpr double a = WGS84_Ellipse.a;
+ constexpr double b = WGS84_Ellipse.b();
GPS_Math_XYZ_To_LatLonH(phi,lambda,H,x,y,z,a,b);
double F0 = 1.000035;
double phi0 = 53.5;
double lambda0 = -8.;
- double a = 6377340.189;
- double b = 6356034.447;
+ constexpr double a = Airy1830Modified_Ellipse.a;
+ constexpr double b = Airy1830Modified_Ellipse.b();
GPS_Math_LatLon_To_EN(E,N,phi,lambda,N0,E0,phi0,lambda0,F0,a,b);
double F0 = 0.9996012717;
double phi0 = 49.;
double lambda0 = -2.;
- double a = 6377563.396;
- double b = 6356256.910;
+ constexpr double a = Airy1830_Ellipse.a;
+ constexpr double b = Airy1830_Ellipse.b();
GPS_Math_LatLon_To_EN(E,N,phi,lambda,N0,E0,phi0,lambda0,F0,a,b);
const double lambda0 = 7.43958333;
const double E0 = 600000.0;
const double N0 = 200000.0;
- double phi, lambda, alt, a, b;
+ double phi, lambda, alt;
if (lat < 44.89022757) {
return 0;
return 0;
}
- assert(strcmp(GPS_Ellipses[4].name, "Bessel 1841") == 0);
- a = GPS_Ellipses[4].a;
- b = a - (a / GPS_Ellipses[4].invf);
+ constexpr double a = Bessel1841_Ellipse.a;
+ constexpr double b = Bessel1841_Ellipse.b();
GPS_Math_WGS84_To_Known_Datum_M(lat, lon, 0, &phi, &lambda, &alt, 123);
GPS_Math_Swiss_LatLon_To_EN(phi, lambda, E, N, phi0, lambda0, E0, N0, a, b);
const double lambda0 = 7.43958333;
const double E0 = 600000.0;
const double N0 = 200000.0;
- double phi, lambda, alt, a, b;
+ double phi, lambda, alt;
- assert(strcmp(GPS_Ellipses[4].name, "Bessel 1841") == 0);
- a = GPS_Ellipses[4].a;
- b = a - (a / GPS_Ellipses[4].invf);
+ constexpr double a = Bessel1841_Ellipse.a;
+ constexpr double b = Bessel1841_Ellipse.b();
GPS_Math_Swiss_EN_To_LatLon(E, N, &phi, &lambda, phi0, lambda0, E0, N0, a, b);
GPS_Math_Known_Datum_To_WGS84_M(phi, lambda, 0, lat, lon, &alt, 123);
int32_t ellipse = GPS_Datums[datum].ellipse;
a = GPS_Ellipses[ellipse].a;
- b = a - (a / GPS_Ellipses[ellipse].invf);
+ b = GPS_Ellipses[ellipse].b();
GPS_Math_WGS84_To_Known_Datum_M(lat, lon, 0, &phi, &lambda, &alt, datum);
GPS_Math_Cassini_LatLon_To_EN(phi, lambda, E, N,
int32_t ellipse = GPS_Datums[datum].ellipse;
a = GPS_Ellipses[ellipse].a;
- b = a - (a / GPS_Ellipses[ellipse].invf);
+ b = GPS_Ellipses[ellipse].b();
GPS_Math_Cassini_EN_To_LatLon(E, N, &phi, &lambda, phi0, lambda0,
E0, N0, a, b);
double F0 = 0.9996012717;
double phi0 = 49.;
double lambda0 = -2.;
- double a = 6377563.396;
- double b = 6356256.910;
+ constexpr double a = Airy1830_Ellipse.a;
+ constexpr double b = Airy1830_Ellipse.b();
GPS_Math_EN_To_LatLon(E,N,phi,lambda,N0,E0,phi0,lambda0,F0,a,b);
double F0 = 1.000035;
double phi0 = 53.5;
double lambda0 = -8.;
- double a = 6377340.189;
- double b = 6356034.447;
+ constexpr double a = Airy1830Modified_Ellipse.a;
+ constexpr double b = Airy1830Modified_Ellipse.b();
GPS_Math_EN_To_LatLon(E,N,phi,lambda,N0,E0,phi0,lambda0,F0,a,b);
{
double Sa;
double Sif;
- double Da;
- double Dif;
double x;
double y;
double z;
int32_t idx;
- Da = 6378137.0;
- Dif = 298.257223563;
+ constexpr double Da = WGS84_Ellipse.a;
+ constexpr double Dif = WGS84_Ellipse.invf;
idx = GPS_Datums[n].ellipse;
Sa = GPS_Ellipses[idx].a;
double* Dphi, double* Dlam, double* DH,
int32_t n)
{
- double Sa;
- double Sif;
double Da;
double Dif;
double x;
double z;
int32_t idx;
- Sa = 6378137.0;
- Sif = 298.257223563;
+ constexpr double Sa = WGS84_Ellipse.a;
+ constexpr double Sif = WGS84_Ellipse.invf;
idx = GPS_Datums[n].ellipse;
Da = GPS_Ellipses[idx].a;
double Sa;
double Sif;
double Sb;
- double Da;
- double Dif;
- double Db;
double x;
double y;
double z;
double sy;
double sz;
- Da = 6378137.0;
- Dif = 298.257223563;
- Db = Da - (Da / Dif);
+ constexpr double Da = WGS84_Ellipse.a;
+ constexpr double Db = WGS84_Ellipse.b();
idx = GPS_Datums[n].ellipse;
Sa = GPS_Ellipses[idx].a;
double* Dphi, double* Dlam, double* DH,
int32_t n)
{
- double Sa;
- double Sif;
double Da;
double Dif;
double x;
double y;
double z;
int32_t idx;
- double Sb;
double Db;
double dx;
double dy;
double dz;
- Sa = 6378137.0;
- Sif = 298.257223563;
- Sb = Sa - (Sa / Sif);
+ constexpr double Sa = WGS84_Ellipse.a;
+ constexpr double Sb = WGS84_Ellipse.b();
idx = GPS_Datums[n].ellipse;
Da = GPS_Ellipses[idx].a;
double* DH, int32_t n1, int32_t n2)
{
double Sa;
- double Sif;
double Da;
- double Dif;
double x1;
double y1;
double z1;
idx1 = GPS_Datums[n1].ellipse;
Sa = GPS_Ellipses[idx1].a;
- Sif = GPS_Ellipses[idx1].invf;
- Sb = Sa - (Sa / Sif);
+ Sb = GPS_Ellipses[idx1].b();
x1 = GPS_Datums[n1].dx;
y1 = GPS_Datums[n1].dy;
idx2 = GPS_Datums[n2].ellipse;
Da = GPS_Ellipses[idx2].a;
- Dif = GPS_Ellipses[idx2].invf;
- Db = Da - (Da / Dif);
+ Db = GPS_Ellipses[idx2].b();
x2 = GPS_Datums[n2].dx;
y2 = GPS_Datums[n2].dy;
double N0;
double E0;
double F0;
- double a;
- double b;
if (!GPS_Math_LatLon_To_UTM_Param(lat,lon,zone,zc,&lambda0,&E0,
&N0,&F0)) {
phi0 = 0.0;
- assert(strcmp(GPS_Ellipses[21].name, "GRS80") == 0);
- a = GPS_Ellipses[21].a;
- b = a - (a / GPS_Ellipses[21].invf);
+ constexpr double a = GRS80_Ellipse.a;
+ constexpr double b = GRS80_Ellipse.b();
GPS_Math_LatLon_To_EN(E,N,lat,lon,N0,E0,phi0,lambda0,F0,a,b);
idx = GPS_Datums[n].ellipse;
a = GPS_Ellipses[idx].a;
- b = a - (a / GPS_Ellipses[idx].invf);
+ b = GPS_Ellipses[idx].b();
GPS_Math_LatLon_To_EN(E,N,lat,lon,N0,E0,phi0,lambda0,F0,a,b);
//found at http://www.gpsy.com/gpsinfo/geotoutm/index.html
double k0 = 0.9996;
- double a, b;
+ double a, f;
double eccSquared;
double eccPrimeSquared;
double e1;
double x, y;
a = GPS_Ellipses[ReferenceEllipsoid].a;
- b = 1 / GPS_Ellipses[ReferenceEllipsoid].invf;
- eccSquared = b * (2.0 - b);
+ f = 1 / GPS_Ellipses[ReferenceEllipsoid].invf;
+ eccSquared = f * (2.0 - f);
e1 = (1-sqrt(1-eccSquared))/(1+sqrt(1-eccSquared));
x = UTMEasting - E0; //remove false easting